|
===================================== 〔語彙分解〕的な部分一致の検索結果は以下の通りです。 ・ プログラミング : [ぷろぐらみんぐ] 【名詞】 1. programming 2. programing, (n) programming/programing 関数型プログラミングにおいて、モナド(monad)は計算を表現する構造であり、計算ステップの列からなる。つまり、型がモナド構造をもつというのは、命令を繋げるやり方、言い換えるとその型をもつ関数をネストさせる規則が定まっていることをいう。これはプログラマがパイプラインを作ることを可能にする。パイプラインでは入力データを1ステップずつ処理するが、モナドは各アクションに追加の処理規則を上乗せすることができる〔O'Sullivan, Bryan; Goerzen, John; Stewart, Don. ''Real World Haskell ''. O'Reilly, 2009. ch. 14.〕。このことから、モナドは「プログラム可能なセミコロン」と記述することもできる〔。セミコロンは多くの命令型プログラミング言語で個々の文を繋ぐ演算子であり、この例えは、パイプライン中の文の間に追加でコードを実行できることを示唆している。さらにモナドは組み立てラインというメタファーで説明することもできる。ベルトコンベアが機能ユニットの間のデータ転送を行い、各ユニットが一度にひとつずつそれを処理するのである。他にも、を構築するための関数型デザインパターンと見ることもできる。 純粋関数型プログラムでは構造化プログラミングに見られるような、逐次実行する命令列を含む手続きの構成にモナドを利用することができる〔Wadler, Philip. Comprehending Monads . Proceedings of the 1990 ACM Conference on LISP and Functional Programming, Nice. 1990.〕〔Wadler, Philip. The Essence of Functional Programming . Conference Record of the Nineteenth Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages. 1992.〕。モナド構造によって、プログラミングにおける多くの共通概念を記述することが可能である。これには入出力といった副作用、変数への代入、例外処理、構文解析、非決定計算、並行計算、継続がある。言語の意味を大きく拡張することなく、純粋性を保ったままこれらの概念が利用できるようになる。Haskellのような言語ではモナドを標準ライブラリで提供しており、プログラマはこれらの抽象的な定義を再利用することで、多くの異なったライブラリにおいても同じやりかたで機能を合成することが可能になっている〔Hughes, J. (2005). Programming with arrows . In Advanced Functional Programming (pp. 73-129). Springer Berlin Heidelberg. "〕。 形式的には、モナドは型構築子 ''M'' とふたつの演算 ''bind'' と ''return'' から構成される(''return''を''unit''と呼ぶこともある)。 * ''return'' 演算は素な型の値を受け取って、構築子によりモナド的なコンテナに詰めて返す。これは ''モナド的な値''を作成する。 * ''bind'' 演算はモナド的な値と、素な型の値からモナド的な値への関数を受け取って、新しいモナド的な値を返す。 この演算はモナド的な関数(引数や返り値がモナドである関数)を正しく合成できるように、いくつかの性質を満たさなければならない。プログラムの中に命令を追加するという意味で、モナドはアスペクト指向プログラミングとしての側面もある〔De Meuter, Wolfgang. "Monads as a theoretical foundation for AOP ". Workshop on Aspect Oriented Programming, ECOOP 1997.〕。domain logicはアプリケーションプログラマが定めるのに対して、必要なブックキーピングは前もってモナドとして定義することができる。 名称と概念は圏論にちなむもので、モナドは一種の函手であり、圏の間の写像である。しかし、関数型プログラミングの文脈における''モナド''は通常は圏論における強モナドを指すことが多い〔。 ==歴史== プログラミングにおけるモナドの概念は1980年代のプログラム言語に見られるが、このときは「コマンド」と呼ばれ形式化はされなかった。 1991年にEugenio Moggiはプログラムの構造化でモナドを初めて汎用的に使用した。この成果を元に、Philip WadlerやSimon Peyton Jonesといったプログラム言語の研究者(二人ともHaskellの言語仕様に取り組んでいた)により実装が行われた。初期のバージョンのHaskellは問題の多い「遅延リスト」を用いた入出力を使っていたが、Haskell 1.3からは遅延評価により柔軟に合成可能なモナドによる入出力が導入された。 入出力に加えて、プログラム言語研究者とHaskellのライブラリ設計者は構文解析器やインタープリタにモナドを適用することに成功した。Haskellのdo記法に現れる性質から、モナドの概念はapplicative functorとarrowへと一般化された。 長い間、Haskellとその派生だけがプログラミングにおけるモナドの主な利用者であった。しかし、Scheme・Perl・Python・Racket・Clojure・Scalaにおいても定式化されており、新しいMLの標準でもオプションとなっている。最近では、F#がコンピュテーション式または「ワークフロー」と呼ばれる機能を導入した。これは、命令型プログラムしか経験のないプログラマにもなじみやすい構文を使ったモナド的構成を提供しようという試みである。 抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「関数型プログラミングにおいて、モナド(monad)は計算を表現する構造であり、計算ステップの列からなる。つまり、型がモナド構造をもつというのは、命令を繋げるやり方、言い換えるとその型をもつ関数をネストさせる規則が定まっていることをいう。これはプログラマがパイプラインを作ることを可能にする。パイプラインでは入力データを1ステップずつ処理するが、モナドは各アクションに追加の処理規則を上乗せすることができるO'Sullivan, Bryan; Goerzen, John; Stewart, Don. ''Real World Haskell ''. O'Reilly, 2009. ch. 14.。このことから、モナドは「プログラム可能なセミコロン」と記述することもできる。セミコロンは多くの命令型プログラミング言語で個々の文を繋ぐ演算子であり、この例えは、パイプライン中の文の間に追加でコードを実行できることを示唆している。さらにモナドは組み立てラインというメタファーで説明することもできる。ベルトコンベアが機能ユニットの間のデータ転送を行い、各ユニットが一度にひとつずつそれを処理するのである。他にも、を構築するための関数型デザインパターンと見ることもできる。純粋関数型プログラムでは構造化プログラミングに見られるような、逐次実行する命令列を含む手続きの構成にモナドを利用することができるWadler, Philip. Comprehending Monads . Proceedings of the 1990 ACM Conference on LISP and Functional Programming, Nice. 1990.Wadler, Philip. The Essence of Functional Programming . Conference Record of the Nineteenth Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages. 1992.。モナド構造によって、プログラミングにおける多くの共通概念を記述することが可能である。これには入出力といった副作用、変数への代入、例外処理、構文解析、非決定計算、並行計算、継続がある。言語の意味を大きく拡張することなく、純粋性を保ったままこれらの概念が利用できるようになる。Haskellのような言語ではモナドを標準ライブラリで提供しており、プログラマはこれらの抽象的な定義を再利用することで、多くの異なったライブラリにおいても同じやりかたで機能を合成することが可能になっているHughes, J. (2005). Programming with arrows . In Advanced Functional Programming (pp. 73-129). Springer Berlin Heidelberg. "。形式的には、モナドは型構築子 ''M'' とふたつの演算 ''bind'' と ''return'' から構成される(''return''を''unit''と呼ぶこともある)。* ''return'' 演算は素な型の値を受け取って、構築子によりモナド的なコンテナに詰めて返す。これは ''モナド的な値''を作成する。* ''bind'' 演算はモナド的な値と、素な型の値からモナド的な値への関数を受け取って、新しいモナド的な値を返す。この演算はモナド的な関数(引数や返り値がモナドである関数)を正しく合成できるように、いくつかの性質を満たさなければならない。プログラムの中に命令を追加するという意味で、モナドはアスペクト指向プログラミングとしての側面もあるDe Meuter, Wolfgang. "Monads as a theoretical foundation for AOP ". Workshop on Aspect Oriented Programming, ECOOP 1997.。domain logicはアプリケーションプログラマが定めるのに対して、必要なブックキーピングは前もってモナドとして定義することができる。名称と概念は圏論にちなむもので、モナドは一種の函手であり、圏の間の写像である。しかし、関数型プログラミングの文脈における''モナド''は通常は圏論における強モナドを指すことが多い。==歴史==プログラミングにおけるモナドの概念は1980年代のプログラム言語に見られるが、このときは「コマンド」と呼ばれ形式化はされなかった。1991年にEugenio Moggiはプログラムの構造化でモナドを初めて汎用的に使用した。この成果を元に、Philip WadlerやSimon Peyton Jonesといったプログラム言語の研究者(二人ともHaskellの言語仕様に取り組んでいた)により実装が行われた。初期のバージョンのHaskellは問題の多い「遅延リスト」を用いた入出力を使っていたが、Haskell 1.3からは遅延評価により柔軟に合成可能なモナドによる入出力が導入された。入出力に加えて、プログラム言語研究者とHaskellのライブラリ設計者は構文解析器やインタープリタにモナドを適用することに成功した。Haskellのdo記法に現れる性質から、モナドの概念はapplicative functorとarrowへと一般化された。長い間、Haskellとその派生だけがプログラミングにおけるモナドの主な利用者であった。しかし、Scheme・Perl・Python・Racket・Clojure・Scalaにおいても定式化されており、新しいMLの標準でもオプションとなっている。最近では、F」の詳細全文を読む スポンサード リンク
|